package semantico;

import simbolos.Tipo;

/**
 * Implementa codigo de tres enderecos para um comando 'senao'.
 * @author Cefanys
 *
 */
public class DesvioSENAO extends Codigo {
	
	Expressao expressao;
	Codigo codigo_se;
	Codigo codigo_senao;
	
	public DesvioSENAO(Expressao expressao, Codigo codigo_se, Codigo codigo_senao) throws SemanticoException{
		this.expressao = expressao;
		this.codigo_se = codigo_se;
		this.codigo_senao = codigo_senao;
		
		if(this.expressao.tipo != Tipo.LOGICO) montaErro(2, "");
	}
	
	/**
	 * Gera codigo de tres enderecos
	 * @param inicio - marca o inicio do codigo para o comando.
	 * @param primeiraInstrucaoApos - marca a primeira instrucao apos o codigo do comando.
	 * @throws SemanticoException 
	 */
	public void gerar(int inicio, int primeiraInstrucaoApos) throws SemanticoException{
		int rotulo_se = novoRotulo();
		int rotulo_senao = novoRotulo();
		expressao.desviar(0, rotulo_senao); //entra no 'se' se a expressao for verdadeira
		emitirRotulos(rotulo_se);
		codigo_se.gerar(rotulo_se, primeiraInstrucaoApos);
		emitirCodigo(" goto L" + primeiraInstrucaoApos);
		emitirRotulos(rotulo_senao);
		codigo_senao.gerar(rotulo_senao, primeiraInstrucaoApos);
	}

}
